#pragma once
#include <queue>
#include <mutex>
#include <condition_variable>
#include "MysqlConn.hpp"
using namespace std;
class ConnectionPool
{
	// 类名来获取实例  静态方法
private:
	ConnectionPool();
	bool parseJsonFile();
	void producerConnection();
	void consumerConnection();
	// 添加连接
	void addConnection();


	string m_ip;
	string m_user;
	string m_passwd;
	string m_dbName;
	size_t m_port;
	size_t m_minSize, m_maxSize;
	// 线程阻塞等待的时间
	int m_timeout, m_maxIdleTime;
	queue<MysqlConn*> m_connectionQ;
	mutex m_mutexQ;
	condition_variable m_cond;
public:
	static ConnectionPool* getConnectionPool();
	// 拷贝构造要么直接删除 要么私有化
	ConnectionPool(const ConnectionPool& obj) = delete;
	// 复制操作符重载也要删除
	ConnectionPool& operator=(const ConnectionPool& obj) = delete;
	// 操作完之后对应的实例对象就只有一个了
	~ConnectionPool();

	// 获取连接函数
	shared_ptr<MysqlConn> getConnection();
};